// package cn.geminis.cloud.gateway.config;

// import cn.geminis.cloud.gateway.service.PermissionAuthorizationManager;
// import lombok.SneakyThrows;
// import lombok.extern.slf4j.Slf4j;
// import org.springframework.beans.factory.annotation.Value;
// import org.springframework.context.annotation.Bean;
// import org.springframework.context.annotation.Configuration;
// import org.springframework.http.HttpMethod;
// import org.springframework.security.config.Customizer;
// import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
// import org.springframework.security.config.web.server.ServerHttpSecurity;
// import org.springframework.security.oauth2.client.oidc.web.server.logout.OidcClientInitiatedServerLogoutSuccessHandler;
// import org.springframework.security.oauth2.client.registration.ClientRegistration;
// import org.springframework.security.oauth2.client.registration.InMemoryReactiveClientRegistrationRepository;
// import org.springframework.security.web.server.SecurityWebFilterChain;
// import org.springframework.util.StringUtils;

// import java.util.HashMap;

// /**
//  * @author puddi
//  */
// @Configuration
// @EnableWebFluxSecurity
// @Slf4j
// public class WebSecurityConfiguration {

//     @Value("#{'${geminis.oauth.excludedUrls}'.split(',')}")
//     private String[] excludedUrls;

//     @Value("#{'${geminis.oauth.protectedUrls}'.split(',')}")
//     private String[] protectedUrls;

//     @Value("${spring.security.oauth2.client.provider.geminis.end-session-endpoint}")
//     private String endSessionEndpoint;

//     @Value("${spring.security.oauth2.client.registration.geminis.post-logout-redirect-uri}")
//     private String postLogoutRedirectUri;

//     @Bean
//     @SneakyThrows
//     public SecurityWebFilterChain webFluxSecurityFilterChain(ServerHttpSecurity http,
//                                                              PermissionAuthorizationManager permissionAuthorizationManager,
//                                                              InMemoryReactiveClientRegistrationRepository clientRegistrationRepository) {
//         http.authorizeExchange(customizer ->
//                 customizer
//                         .pathMatchers(HttpMethod.OPTIONS).permitAll()
//                         .pathMatchers(this.excludedUrls).permitAll()
//                         .pathMatchers(this.protectedUrls).authenticated()
//                         .pathMatchers(this.protectedUrls).access(permissionAuthorizationManager)
//                         .anyExchange().permitAll()
//         );

//         //启用单点登录
//         http.oauth2Login(Customizer.withDefaults());

//         //修改登出地址
//         if (StringUtils.hasText(this.endSessionEndpoint)) {
//             var field = ClientRegistration.ProviderDetails.class.getDeclaredField("configurationMetadata");
//             field.setAccessible(true);
//             clientRegistrationRepository.forEach(clientRegistration -> {
//                 var config = new HashMap<>(clientRegistration
//                         .getProviderDetails()
//                         .getConfigurationMetadata());
//                 config.replace("end_session_endpoint", this.endSessionEndpoint);
//                 try {
//                     field.set(clientRegistration.getProviderDetails(), config);
//                 } catch (IllegalAccessException e) {
//                     throw new RuntimeException(e);
//                 }
//             });
//         }
//         var oidcLogoutSuccessHandler = new OidcClientInitiatedServerLogoutSuccessHandler(clientRegistrationRepository);
//         oidcLogoutSuccessHandler.setPostLogoutRedirectUri(this.postLogoutRedirectUri);
//         http.logout(customizer -> customizer.logoutSuccessHandler(oidcLogoutSuccessHandler));

//         //启用资源保护
//         http.oauth2ResourceServer(customizerr -> customizerr.jwt(jwtSpec ->
//                 {
//                 })
//         );

//         http.csrf(ServerHttpSecurity.CsrfSpec::disable);

//         return http.build();
//     }
// }
